// 为什么数组传进函数后sizeof的值会变

#include <stdio.h>

void minmax(int a[], int len, int *max, int *min);

int main(int argc, char const *argv[])
{
    int a[] = {2, 80, 95, 1, 27, 46, 25, 25, 12, 39, 69, 69, 97, 23,};
    int min, max;
    printf("main sizeof(a) = %lu\n", sizeof(a));
    // 运行时，函数内外的a的地址是相同的
    printf(" a = %p\n", a);
    // 对数组取地址时，用数组变量本身取就可以
    // 对数组元素取地址则需要使用 &。
    // 数组地址等于数组第0个元素的地址
    printf("&a = %p\n", &a);
    printf("*a = %d\n", *a);

    minmax(a, sizeof(a) / sizeof(a[0]), &min, &max);
    printf("min = %d, max = %d\n", min, max);

    int *p = &min;
    printf("*p = %d\n", *p);
    printf("p[0] = %d\n", p[0]);
    // 实际上，数组相当于 const 指针
    // int a[]; 相当于 int * const a;
    // 所以数组不能用数组赋值
    
    return 0;
}

void minmax(int a[], int len, int *max, int *min)
{
    int i;
    // 会出现警告
    // warning: 'sizeof' on array function parameter 
    //  'a' will return size of 'int *' [-Wsizeof-array-argument]
    // 输出的sizeof(a)的大小等于指针的大小
    printf("minmax sizeof(a) = %lu\n", sizeof(a));
    // 传入的数组是指针形式的
    // 所以以下四种函数原型是等价的
    // int foo(int *ar);
    // int foo(int *);
    // int foo(int a[]);
    // int foo(int [])
    printf("minmax a = %p\n", a);
    *min = *max = a[0];
    for (i = 1; i < len; i++)
    {
        if (a[i] < *min)
        {
            *min = a[i];
        }
        if (a[i] > *max)
        {
            *max = a[i];
        }
    }
}